#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 20
#define ALLOCATE_SIZE 20

/*内存泄露楼的原因有三个：
1.野指针,you 泄露
2.malloc申请的地址没有free释放
3.踩内存  */
int main(int argc, char const *argv[])
{

   // char * ptr = NULL;//指针必修初始化，否则会野指针,NULL十非法地址，不允许使用
    /* 任何变量都有地址 */
    //在推上申请空间
     char * ptr =(char *)malloc(sizeof(char) * ALLOCATE_SIZE);//void *是万能指针，可以强制转换指针类型,内存条上申请了堆

     if (ptr == NULL);
     {
         perror("malloc error\n");
         exit(-1);//程序退出
     }

    int len = sizeof(ptr);
    printf("len:%d\n", len); 

    strcpy(ptr, "hello word");
    printf("ptr:%s\n",ptr);

#if  0

   // char ptr[BUFFER_SIZE];
      memset(ptr, 0, sizeof(ptr));
   // int len = sizeof(ptr);//20
    printf("len:%d\n", len);
    strcpy( ptr, "hello world\n");
    printf("ptr:%s\n", ptr);

    //内存泄漏: 1. gcc -g 文件名；
    //         2.valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out

    free(ptr);//释放内存
    //避免泄露
    #endif
   //使用安全函数strncpy
   
    //char *ptr;
    printf("hello world\n");
    strncpy( ptr, "hello world", ALLOCATE_SIZE - 1);
    printf("ptr:%s\n", ptr);

    return 0;

}